home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 011 / tsrsrc22.arc / FMARK.ASM < prev    next >
Assembly Source File  |  1987-03-03  |  8KB  |  228 lines

  1. ;FMARK.ASM - mark a position in memory,
  2. ;            above which TSRs will later be cleared by RELEASE.COM
  3. ;            this version leaves a minimal size MARK in memory,
  4. ;              storing the rest on disk
  5. ;            requires a single command line parameter naming
  6. ;              the file where the mark will be stored
  7. ;
  8. ; Syntax:  FMARK [d:][path]filename
  9. ;
  10. ; VERSION 2.0  6/17/86
  11. ;   start at a version number compatible with other TSR utilities
  12. ; VERSION 2.1  7/18/86
  13. ;   keep consistent with RELEASE
  14. ; VERSION 2.2  3/4/87
  15. ;   add save area for BIOS data areas
  16. ;     40:A8 (8 bytes for EGA)
  17. ;     40:F0 (16 bytes for interapplications communications)
  18. ;
  19. ; written for CHASM (CHeap ASseMbler)
  20. ; by Kim Kokkonen, TurboPower Software
  21. ; telephone: 408-438-8608, Compuserve 72457,2131
  22. ;
  23. ;
  24. ;
  25. fmark  proc    near
  26.  
  27. ;parse command line for file name
  28.        mov     si,81H           ;point to command line
  29.        mov     di,offset(filnm) ;point to filename storage string
  30.        cld
  31.  
  32. get1   lodsb                    ;get first non-blank
  33.        cmpb    al,32            ;skip space
  34.        je      get1
  35.        cmpb    al,9             ;skip tab
  36.        je      get1
  37.        cmpb    al,13            ;check for end of input
  38.        jne     get2             ;got a non-blank, now get the parameter
  39.        jmp     error            ;no parameter --> error
  40.  
  41. get2   cmp     al,'a'
  42.        jl      sto1
  43.        cmp     al,'z'
  44.        jg      sto1
  45.        and     al,0DFH          ;uppercase
  46. sto1   stosb                    ;store the non-blank character
  47.        lodsb                    ;get next character
  48.        cmpb    al,32            ;terminate with blank, tab, or <cr>
  49.        je      gotit
  50.        cmpb    al,9
  51.        je      gotit
  52.        cmpb    al,13
  53.        je      gotit
  54.        jmps    get2
  55.  
  56. ;create the specified file
  57. gotit  mov     al,0
  58.        stosb                    ;terminate ASCIIZ pathname
  59.        mov     dx,offset(filnm)
  60.        xor     cx,cx            ;normal attribute
  61.        mov     ah,3CH
  62.        int     21H              ;DOS CREAT
  63.        jae     store
  64.  
  65.        mov     dx,offset(badfil) ;bad file name
  66.        mov     ah,9
  67.        int     21H
  68.        jmp     error
  69.  
  70. ;store the interrupt vector table
  71. store  mov     bx,ax           ;keep file handle in bx
  72.        push    ds              ;save ds
  73.        mov     cx,400H         ;1024 bytes to store
  74.        xor     ax,ax
  75.        mov     ds,ax           ;segment 0
  76.        mov     dx,ax           ;offset 0
  77.        mov     ah,40H
  78.        int     21H             ;write block to file
  79.        pop     ds              ;get ds back
  80.        jae     egasav          ;ok, continue
  81.  
  82.        mov     dx,offset(nowrit) ;write error
  83.        mov     ah,9
  84.        int     21H
  85.        jmp     error
  86.  
  87. ;store the EGA save pointer
  88. egasav push    ds              ;save ds
  89.        mov     cx,0008H        ;8 bytes to store
  90.        mov     ax,0040H
  91.        mov     ds,ax           ;BIOS data segment
  92.        mov     dx,00A8H        ;EGA save table pointer
  93.        mov     ah,40H
  94.        int     21H             ;write block to file
  95.        pop     ds              ;get ds back
  96.        jae     intcom          ;ok, continue
  97.  
  98.        mov     dx,offset(nowrit) ;write error
  99.        mov     ah,9
  100.        int     21H
  101.        jmp     error
  102.  
  103. intcom
  104.        push    ds              ;save ds
  105.        mov     cx,0010H        ;16 bytes to store
  106.        mov     ax,0040H
  107.        mov     ds,ax           ;BIOS data segment
  108.        mov     dx,00F0H        ;interapplications communication area
  109.        mov     ah,40H
  110.        int     21H             ;write block to file
  111.        pop     ds              ;get ds back
  112.        jae     ems             ;ok, continue
  113.  
  114.        mov     dx,offset(nowrit) ;write error
  115.        mov     ah,9
  116.        int     21H
  117.        jmp     error
  118.  
  119. ;determine whether EMS is present
  120. ems    push    bx              ;temporarily store the real file handle
  121.        xor     bx,bx           ;zero the EMS handle count in case EMS not present
  122.        mov     dx,offset(emsnm)
  123.        mov     ax,3D00H
  124.        int     21H
  125.        jb      sthand          ;EMS driver not installed
  126.  
  127. ;EMS present, close the open "handle" first
  128.        mov     bx,ax           ;EMS handle into bx
  129.        mov     ah,3EH
  130.        int     21H             ;close handle
  131.  
  132. ;get the current EMS page map
  133.        mov     ah,4DH
  134.        mov     di,offset(emsmap) ;es=cs already
  135.        xor     bx,bx           ;required by some versions of EMM (bug workaround)
  136.        cld                     ;required by some versions of EMM
  137.        int     67H
  138.        or      ah,ah
  139.        jz      sthand          ;result ok
  140.        xor     bx,bx           ;error, return zero EMS handles
  141.  
  142. ;store the number of active handles
  143. sthand mov     emscnt,bx       ;count of active handles
  144.  
  145. ;write the handle table to disk
  146.        shl     bx
  147.        shl     bx              ;4 bytes per handle
  148.        inc     bx
  149.        inc     bx              ;2 more bytes for the handle count
  150.        mov     cx,bx           ;number of bytes to write
  151.        pop     bx              ;get file handle back
  152.        mov     dx,offset(emscnt) ;what we're writing
  153.        mov     ah,40H
  154.        int     21H             ;write out the table
  155.        jae     closfl          ;ok,continue
  156.  
  157.        mov     dx,offset(nowrit) ;error while writing
  158.        mov     ah,9
  159.        int     21H
  160.        jmps    error
  161.  
  162. ;close up the table file
  163. closfl mov     ah,3EH
  164.        int     21H             ;close handle
  165.        jae     idstr           ;ok, continue
  166.  
  167.        mov     dx,offset(badcls) ;error while closing file
  168.        mov     ah,9
  169.        int     21H
  170.        jmps    error
  171.  
  172. ;put a standard ID string into the PSP for RELEASE to check
  173. idstr  mov     si,offset(id)
  174.        mov     di,60H          ;unused area of the PSP
  175.        mov     cx,9            ;characters in ID string
  176.        cld
  177.        rep
  178.        movsb                   ;copy string
  179.  
  180. ;deallocate environment block of this mark
  181. deall  mov     ax,[002CH]      ;environment segment
  182.        mov     es,ax           ;  into es
  183.        mov     ah,49H
  184.        int     21H             ;deallocate, no reason for an error to occur
  185.  
  186. ;print message and TSR
  187. gores  mov     dx,offset(didit)
  188.        mov     ah,9
  189.        int     21H             ;write success message including filename
  190.        mov     dx,offset(crlf) ;newline
  191.        mov     ah,9
  192.        int     21H
  193.  
  194.        xor     dx,dx           ;get number of paragraphs to keep
  195.        mov     dl,[80H]        ;length of command line
  196.        add     dx,80H          ;rest of PSP
  197.        mov     cl,4
  198.        shr     dx,cl           ;convert to paragraphs
  199.        inc     dx              ;round up
  200.        mov     ax,3100H
  201.        int     21H             ;terminate and stay resident
  202.  
  203. ;error output - show syntax line
  204. error  mov     dx,offset(syntax)
  205.        mov     ah,9
  206.        int     21H
  207.  
  208. ;exit with error
  209. errex  mov     ax,4C01H
  210.        int     21H
  211.        endp
  212.  
  213. ;messages
  214. emsnm  db      'EMMXXXX0',0    ;file name for testing EMS presence
  215. id     db      'FMARK TSR'     ;id string for RELEASE check
  216. badfil db      13,10,'Could not open file for writing',36
  217. nowrit db      13,10,'Error while writing',36
  218. badcls db      13,10,'Error closing table file',36
  219. syntax db      13,10,'Syntax:  FMARK [d:][path]filename'
  220. crlf   db      13,10,36
  221. didit  db      13,10,'FMARK 2.2 - Marked current memory position in '
  222.  
  223. ;data storage area
  224. filnm  ds      50H,36          ;file name where tables are written
  225. emscnt db      0,0             ;holds number of active pages in map that follows
  226. emsmap db      0,0             ;holds EMS page map if installed
  227.                                ;(note may extend 1K bytes past end of file in memory)
  228.